package com.sffzh.util.format;

import java.util.Calendar;

import com.google.gson.ExclusionStrategy;
import com.google.gson.FieldAttributes;

/**
 * gson封装过滤策略：
 * 按注释进行过滤，仅保留注释JsonVersion中包含的字段
 * @author sffzh
 *
 */
public class GsonAnnotationExclusionStrategy implements ExclusionStrategy {
	public String useVersion;
	public GsonAnnotationExclusionStrategy(String useVersion){
		this.useVersion=useVersion;
	}
	public GsonAnnotationExclusionStrategy(){};
	
	/**
	 * Message.Data的接口。所有实现此接口的类将被认为是后台用于封装数据的类，在过滤gson时将保留。
	 * @author sffzh
	 *
	 */
	public interface MainData{
		
	}
	
	public GsonAnnotationExclusionStrategy setVersion(String version){
		this.useVersion=version;
		return this;
	}
      @Override
    public boolean shouldSkipClass(Class<?> clazz) {
    	  return Calendar.class.equals(clazz);
    }

	@Override
	public boolean shouldSkipField(FieldAttributes arg0) {
		try{//Class.asSubclass(clazz)这个方法，如果前者是后者的子类则返回该子类，否则抛出异常。
			if(arg0.getDeclaringClass().equals(arg0.getDeclaringClass().asSubclass(MainData.class))){
				return false;
			}
		}catch (java.lang.ClassCastException e){
			//arg0.getDeclaringClass()不是MainData的子类
		}
//		if(Data.class.equals(arg0.getDeclaringClass())){
//			return false;
//		}
		if(useVersion==null){
			return false;
		}
		if(arg0.getAnnotation(JsonVersion.class)==null){
			return true;
		}
		String[] versions=arg0.getAnnotation(JsonVersion.class).value();
		if(versions!=null&&versions.length>0){
			for(String str:versions){
				if(useVersion.equals(str)){
					return false;
				}
			}
		}
		return true;
	}
      
  }

